﻿using System;
using Mx.Ipn.Escom.TT20080015.Modelo.Codificacion;

namespace Mx.Ipn.Escom.TT20080015.Modelo.Datos
{
    /// <summary>
    /// La clase Estudio contiene los datos del Caso de Estudio.
    /// </summary>
    public class Estudio
    {
        #region Atributos
        private int id;
        private Recurrencia recurrencia;
        private Age age;
        private Menopause menopause;
        private TumorSize tumorSize;
        private InvNodes invNodes;
        private NodeCaps nodeCaps;
        private DegMalig degMalig;
        private Breast breast;
        private BreastQuad breastQuad;
        private Irradiat irradiat;
        private DateTime diagnostico;
        private DateTime recurrenciaCancer;
        private bool estaCompleto;
        #endregion

        #region Contstructores
        public Estudio() {}

        /// <summary>
        /// Constructor por defecto de la clase Estudio.
        /// </summary>
        /// <param name="id">Identificador del caso de estudio.</param>
        public Estudio(int id)
        {
            this.id = id;
            this.estaCompleto = false;
        }

        /// <summary>
        /// Constructor de la clase Estudio.
        /// </summary>
        /// <param name="recurrencia">Caso de estudio recurrente o no recurrente.</param>
        /// <param name="age">Edad del paciente seleccionada para el registro del caso de estudio</param>
        /// <param name="menopause">Etapa de la menopausia seleccionada para el registro caso de estudio</param>
        /// <param name="tumorSize">Tamaño del tumor seleccionado para el registro caso de estudio</param>
        /// <param name="invNodes">Nodos invadidos seleccionados para el registro caso de estudio</param>
        /// <param name="nodeCaps">Capa de nodos seleccionado para el registro caso de estudio</param>
        /// <param name="degMalig">Grado de malignidad seleccionado para el registro caso de estudio</param>
        /// <param name="breast">Seno seleccionado para el registro caso de estudio</param>
        /// <param name="breastQuad">Cuadrante del seno seleccionado para el registro caso de estudio</param>
        /// <param name="irradiat">Radiación seleccionado para el registro caso de estudio</param>
        /// <param name="registro">Fecha de registro del caso de estudio</param>
        /// <param name="diagnostico">Fecha de diagnostico de recurrencia de cáncer de mama</param>
        /// <param name="id">Identificador para cada caso de estudio</param>
        public Estudio(int id, int recurrencia, int age, int menopause, int tumorSize, int invNodes,
            int nodeCaps, int degMalig, int breast, int breastQuad, int irradiat,
            DateTime diagnostico, DateTime recurrenciaCancer, bool estaCompleto)
        {
            this.id = id;
            this.recurrencia = (Recurrencia)recurrencia;
            this.age = (Age)age;
            this.menopause = (Menopause)menopause;
            this.tumorSize = (TumorSize)tumorSize;
            this.invNodes = (InvNodes)invNodes;
            this.nodeCaps = (NodeCaps)nodeCaps;
            this.degMalig = (DegMalig)degMalig;
            this.breast = (Breast)breast;
            this.breastQuad = (BreastQuad)breastQuad;
            this.irradiat = (Irradiat)irradiat;
            this.diagnostico = diagnostico;
            this.recurrenciaCancer = recurrenciaCancer;
            this.estaCompleto = estaCompleto;
        }

        /// <summary>
        /// Constructor de la clase Estudio.
        /// </summary>
        /// <param name="recurrencia">Caso de estudio recurrente o no recurrente.</param>
        /// <param name="age">Edad del paciente seleccionada para el registro del caso de estudio</param>
        /// <param name="menopause">Etapa de la menopausia seleccionada para el registro caso de estudio</param>
        /// <param name="tumorSize">Tamaño del tumor seleccionado para el registro caso de estudio</param>
        /// <param name="invNodes">Nodos invadidos seleccionados para el registro caso de estudio</param>
        /// <param name="nodeCaps">Capa de nodos seleccionado para el registro caso de estudio</param>
        /// <param name="degMalig">Grado de malignidad seleccionado para el registro caso de estudio</param>
        /// <param name="breast">Seno seleccionado para el registro caso de estudio</param>
        /// <param name="breastQuad">Cuadrante del seno seleccionado para el registro caso de estudio</param>
        /// <param name="irradiat">Radiación seleccionado para el registro caso de estudio</param>
        /// <param name="registro">Fecha de registro del caso de estudio</param>
        /// <param name="diagnostico">Fecha de diagnostico de recurrencia de cáncer de mama</param>
        /// <param name="id">Identificador para cada caso de estudio</param>
        /*public Estudio(int id, string clase, string age, string menopause, string tumorSize,
            string invNodes, string nodeCaps, string degMalig, string breast, 
            string breastQuad, string irradiat, string registro, string diagnostico, string recurrencia)
        {
            string[] reg = registro.Split('/');
            string[] diag = diagnostico.Split('/');
            string[] rec = recurrencia.Split('/');
            this.id = id;
            this.recurrencia = Parametro.getClass(clase);
            this.age = Parametro.getAge(age);
            this.menopause = Parametro.getMenopause(menopause);
            this.tumorSize = Parametro.getTumorSize(tumorSize);
            this.invNodes = Parametro.getInvNodes(invNodes);
            this.nodeCaps = Parametro.getNodeCaps(nodeCaps);
            this.degMalig = Parametro.getDegMalig(degMalig);
            this.breast = Parametro.getBreast(breast);
            this.breastQuad = Parametro.getBreastQuad(breastQuad);
            this.irradiat = Parametro.getIrradiat(irradiat);
            this.registro = new DateTime(Convert.ToInt32(reg[0]), Convert.ToInt32(reg[1]), Convert.ToInt32(reg[2]));
            this.recurrenciaCancer = new DateTime(Convert.ToInt32(rec[0]), Convert.ToInt32(rec[1]), Convert.ToInt32(rec[2]));
            this.diagnostico = new DateTime(Convert.ToInt32(diag[0]), Convert.ToInt32(diag[1]), Convert.ToInt32(diag[2]));
        }*/
        /// <summary>
        /// Constructor de la clase Estudio.
        /// </summary>
        /// <param name="parametros">Arreglo de parametros.</param>
        /// <param name="registro">Fecha de registro del caso de estudio</param>
        /// <param name="diagnostico">Fecha de diagnostico de recurrencia de cáncer de mama</param>
        /// <param name="id">Identificador para cada caso de estudio</param>
        public Estudio(int id, string []parametros, string diagnostico, string recurrencia)
        {
            string[] diag = diagnostico.Split('/');
            string[] rec = recurrencia.Split('/');
            this.id = id;
            this.recurrencia = Parametro.getClass(parametros[(int)Parametros.Clase]);
            this.age = Parametro.getAge(parametros[(int)Parametros.Age]);
            this.menopause = Parametro.getMenopause(parametros[(int)Parametros.Menopause]);
            this.tumorSize = Parametro.getTumorSize(parametros[(int)Parametros.TumorSize]);
            this.invNodes = Parametro.getInvNodes(parametros[(int)Parametros.InvNodes]);
            this.nodeCaps = Parametro.getNodeCaps(parametros[(int)Parametros.NodeCaps]);
            this.degMalig = Parametro.getDegMalig(parametros[(int)Parametros.DegMalig]);
            this.breast = Parametro.getBreast(parametros[(int)Parametros.Breast]);
            this.breastQuad = Parametro.getBreastQuad(parametros[(int)Parametros.BreastQuad]);
            this.irradiat = Parametro.getIrradiat(parametros[(int)Parametros.Irradiat]);
            this.recurrenciaCancer = new DateTime(Convert.ToInt32(rec[0]), Convert.ToInt32(rec[1]), Convert.ToInt32(rec[2]));
            this.diagnostico = new DateTime(Convert.ToInt32(diag[0]), Convert.ToInt32(diag[1]), Convert.ToInt32(diag[2]));
        }
        #endregion

        #region Propiedades
        /// <summary>
        /// Almacena la edad del paciente.
        /// </summary>
        /// <value>Edad del paciente. Rangos de 10 años.</value>
        public Age Age
        {
            get { return age; }
            set { this.age = value; }
        }

        /// <summary>
        /// Almacena el seno donde tuvo cáncer el paciente.
        /// </summary>
        /// <value>Seno del paciente. Derecho o izquierdo.</value>
        public Breast Breast
        {
            get { return breast; }
            set { this.breast = value; }
        }

        /// <summary>
        /// Almacena el cuadrante del seno donde tuvo cáncer el paciente.
        /// </summary>
        /// <value>Cuadrante del Seno. Izquierdo-arriba, izquierdo-abajo, central, derecho-arriba o derecho-abajo.</value>
        public BreastQuad BreastQuad
        {
            get { return breastQuad; }
            set { this.breastQuad = value; }
        }

        /// <summary>
        /// Almacena el grado de malignidad del tumor.
        /// </summary>
        /// <value>Grago de malignidad. Puede ser 1, 2 o 3.</value>
        public DegMalig DegMalig
        {
            get { return degMalig; }
            set { this.degMalig = value; }
        }

        /// <summary>
        /// Almacena los nodos invadidos por el cáncer.
        /// </summary>
        /// <value>Nodos invadidos. Rangos de 3 nodos.</value>
        public InvNodes InvNodes
        {
            get { return invNodes; }
            set { this.invNodes = value; }
        }

        /// <summary>
        /// Almacena si el paciente tuvo o no radiación. 
        /// </summary>
        /// <value>Radiación. Puede ser si o no.</value>
        public Irradiat Irradiat
        {
            get { return irradiat; }
            set { this.irradiat = value; }
        }

        /// <summary>
        /// Almacena la etapa de menopausia del paciente.
        /// </summary>
        /// <value>Menopausia. Puede ser premenopausia, antes o después de los 40 años.</value>
        public Menopause Menopause
        {
            get { return menopause; }
            set { this.menopause = value; }
        }

        /// <summary>
        /// Almacena si las capas de los nodos fueron afectadas.
        /// </summary>
        /// <value>Capas de nodos afectadas. Puede ser si o no.</value>
        public NodeCaps NodeCaps
        {
            get { return nodeCaps; }
            set { this.nodeCaps = value; }
        }

        /// <summary>
        /// Almacena el tamaño del tumor.
        /// </summary>
        /// <value>Tamaño del tumor. Rangos de 5 </value>
        public TumorSize TumorSize
        {
            get { return tumorSize; }
            set { this.tumorSize = value; }
        }
        /// <summary>
        /// Almacena si hubo o no recurrencia del cáncer.
        /// </summary>
        /// <value>Recurrencia. Sus valores son: si o no.</value>
        public Recurrencia Recurrencia
        {
            get { return recurrencia; }
            set { this.recurrencia = value; }
        }

        /// <summary>
        /// Almacena la fecha de cuando al paciente se le diagnostica que ya no tiene cancer.
        /// </summary>
        /// <value>Fecha libre de cancer.</value>
        public DateTime Diagnostico
        {
            get { return diagnostico; }
            set { this.diagnostico = value; }
        }
        /// <summary>
        /// Almacena la fecha de cuando al paciente se le diagnostica la recurrencia.
        /// </summary>
        /// <value>Fecha de recurrencia.</value>
        public DateTime RecurrenciaCancer
        {
            get { return recurrenciaCancer; }
            set { this.recurrenciaCancer = value; }
        }
        /// <summary>
        /// Es una bandera donde se guarda si el registro contiene valores por default.
        /// </summary>
        /// <value>estaCompleto.</value>
        public bool EstaCompleto
        {
            get { return estaCompleto; }
            set { this.estaCompleto = value; }
        }
        #endregion

        /// <summary>
        /// Método que concatena los atributos de la clase Estudio.
        /// </summary>
        /// <returns>Cadena formada por la recurrencia, age, breast, breastQuad, degMalig, invNodes, irradiat,
        /// menopause, nodeCaps, tumorSize, la fecha de registro y la fecha de diagnóstico.</returns>
        public override string  ToString()
        {
            string diag = (diagnostico.CompareTo(new DateTime()) == 0) ? "10000101" : diagnostico.ToString("yyyyMMdd");
            string rec = (recurrenciaCancer.CompareTo(new DateTime()) == 0) ? "10000101" : recurrenciaCancer.ToString("yyyyMMdd");
            string completo = (estaCompleto) ? "1" : "0";
            return "(" + id + "," +
                ((int)recurrencia) + "," +
                ((int)age) + "," +
                ((int)menopause) + "," +
                ((int)tumorSize) + "," +
                ((int)invNodes) + "," +
                ((int)nodeCaps) + "," +
                ((int)degMalig) + "," +
                ((int)breast) + "," +
                ((int)breastQuad) + "," +
                ((int)irradiat) + "," +
                diag + "," +
                rec + "," +
                completo + ")";
        }
    }
}
